/*

* ------------------------------------------------------------------------
* ------------------------------------------------------------------------
* |     Smart-Shop开源商城系统/ Java商城-首选电商平台系统 请务必保留此注释头信息
* |     开源地址: https://gitee.com/ningbo-qishan/gruul-mall
* ------------------------------------------------------------------------
* ------------------------------------------------------------------------
* |     可正常分享和学习源码,未经授权 不可商用！
* |     商业版中台购买/开源版商业授权 联系技术客服
* |     官网:  https://www.73app.cn/
* ------------------------------------------------------------------------
* ------------------------------------------------------------------------
* |     Copyright (c) 2016-2999 宁波启山智软科技有限公司
* |     版权所有 ,侵权必究！
* ------------------------------------------------------------------------

*/
package com.medusa.gruul.platform.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.medusa.gruul.common.core.util.PageUtils;
import com.medusa.gruul.platform.api.entity.AgentInfo;
import com.medusa.gruul.platform.model.dto.agent.*;
import com.medusa.gruul.platform.model.vo.agent.*;

import java.util.List;

/**
 * <p>
 * 代理商信息表 服务类
 * </p>
 *
 * @author whh
 * @since 2020-10-04
 */
public interface IAgentInfoService extends IService<AgentInfo> {


    /**
     * 根据手机号查询
     *
     * @param phone 手机号
     * @return com.medusa.gruul.platform.api.entity.AgentInfo
     */
    AgentInfo getByAccount(String phone);

    /**
     * 新增代理账号
     *
     * @param optionDto    com.medusa.gruul.platform.model.dto.agent.AgenInfoDto
     * @param code         邀请码
     * @param registerType 注册方式 1.官网自行注册  2.商户控制台注册  3.代理商后台
     * @return 代理id
     */
    Long newAccount(AgenInfoDto optionDto, String code, Integer registerType);

    /**
     * 修改代理信息
     *
     * @param dto com.medusa.gruul.platform.model.dto.agent.AgenInfoDto
     */
    void motifyInfo(AgenInfoDto dto);

    /**
     * 获取代理商或直属渠道商列表
     *
     * @param page      页数
     * @param size      条数
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param search      模糊搜索名称或电话
     * @param type
     * @param parentId
     * @return com.medusa.gruul.platform.model.vo.agent.AgentInfosVo
     */
    PageUtils<AgentInfosVo> agentInfos(Integer page, Integer size, String startTime, String endTime, String search, Integer type, Long parentId);

    /**
     * 批量设置折扣
     *
     * @param discountDto com.medusa.gruul.platform.model.dto.BatchDiscountDto
     */
    void batchOption(BatchOptionDto discountDto);

    /**
     * 代理商或渠道商登录
     *
     * @param agentLoginDto com.medusa.gruul.platform.model.dto.agent.AgentLoginDto
     * @return token
     */
    String login(AgentLoginDto agentLoginDto);

    /**
     * 获取当前用户代理正则信息
     *
     * @return com.medusa.gruul.platform.model.vo.agent.AgentInfoVo
     */
    AgentInfoVo agentInfo();

    /**
     * 代理新增渠道商
     *
     * @param agentAddChannelDto com.medusa.gruul.platform.model.dto.agent.AgentAddChannelDto
     */
    void agentAddChannel(AgentAddChannelDto agentAddChannelDto);

    /**
     * 代理查看名下渠道商
     *
     * @param page      页数
     * @param size      条数
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param search    名称或电话
     * @return
     */
    PageUtils<ChannelInfoVo> channel(Integer page, Integer size, String startTime, String endTime, String search);

    /**
     * 获取代理下的渠道商
     *
     * @param agentId 父级代理id
     * @return com.medusa.gruul.platform.api.entity.AgentInfo
     */
    List<AgentInfo> getByParentId(long agentId);

    /**
     * 获取当前代理或渠道商的金额数据和统计数据
     *
     * @return com.medusa.gruul.platform.model.vo.agent.AgentStatsVo
     */
    AgentStatsVo agentStats();

    /**
     * 修改代理自身信息
     *
     * @param agentAddChannelDto com.medusa.gruul.platform.model.dto.agent.AgentInfoMotifyDto
     */
    void agentInfoMotify(AgentInfoMotifyDto agentAddChannelDto);

    /**
     * 获取指定代理详细信息
     *
     * @param agentId 代理id
     * @return com.medusa.gruul.platform.model.vo.agent.AgentDetailInfo
     */
    AgentDetailInfo getByAgentId(Long agentId);

    /**
     * 代理查询名下渠道商信息
     *
     * @param agentId 代理id
     * @return com.medusa.gruul.platform.model.vo.agent.AgentDetailInfo
     */
    AgentDetailInfo getChannelInfo(Long agentId);


    /**
     * 根据邀请码查询代理
     *
     * @param inviteCode 邀请码
     * @return 代理信息
     */
    AgentInfo getByCode(String inviteCode);

    /**
     * 代理批量迁移商户至名下某个渠道商
     *
     * @param migrationDto com.medusa.gruul.platform.model.dto.agent.MerchantsMigrationDto
     */
    void merchantsMigration(MerchantsMigrationDto migrationDto);

    /**
     * 代理每日检测目标是否达到
     */
    void validateAgentTarget();

}
